package com.ysq.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ysq.controller.result.Result;
import com.ysq.entity.User;
import com.ysq.mapper.UserMapper;
import com.ysq.service.UserService;
import com.ysq.utils.MailUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * ClassName: UserServiceImpl
 * Package: com.ysq.service.impl
 * Description:
 *
 * @Author YSQ
 * @Create 2023/1/5 - 14:35
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper mapper;

    @Override
    public boolean sendMsg(User user, HttpSession session) throws MessagingException {
        //拿到邮箱账号
        String phone = user.getPhone();
        //如果邮箱账号不为空就发送验证码, 邮箱账号的格式验证在前端做了
        if (!phone.isEmpty()) {
            //随机生成一个验证码
            String code = MailUtils.achieveCode();
            //打印日志偷看验证码
            log.info("发送的验证码为: {}", code);
            //发送验证码, 这里phone就是邮箱账号, code就是我们刚刚生成的验证码
//            MailUtils.sendTestMail(phone, code); //方便测试这里就不发了
            //把验证码存在session里
            session.setAttribute(phone, code);
            return true;
        }
        return false;
    }

    @Override
    public Result<User> login(Map<String, String> map, HttpSession session) {
        //登录有一个核心逻辑: 除了对比验证码, 就是如果用户不存在, 则要自动在user表中创建这个用户
        //获取邮箱
        String phone = map.get("phone");
        //获取输入的验证码
        String code = map.get("code");
        //从session中获取发送的验证码
        String codeInSession = session.getAttribute(phone).toString();
        //比较用户输入的验证码code是否和session中存的验证码一致, 如果一致就代表登录成功
        if (code != null && code.equals(codeInSession)) {
            //这代表输入正确, 现在要判断当前用户是否存在
            //判断依据就是user表中有没有这个这个phone
            //构造条件构造器
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
            lqw.eq(User::getPhone, phone);//where phone = ?
            //执行查询
            User user = mapper.selectOne(lqw);
            //如果用户不存在, 就创建一个存入user表
            if (user == null) {
                user = new User();
                user.setPhone(phone);//邮箱
                user.setStatus(1);//状态, 1表示正常
                mapper.insert(user);//存入user表
            }
            //存个session, 表示登录状态
            session.setAttribute("user", user.getId());
            return Result.success(user);
        }
        return Result.error("登录失败~~~");
    }
}
